Version 0.2.2 — the model can answer, and one file per platform - #13
Merged
Conversation
Describe-it had never once worked. Structured outputs compile the schema into a
grammar and the service caps a schema at 24 optional parameters; hanging all 29
DSL_RANGES keys plus the nine others off one shape object came to 38 properties
with only `type` required. Thirty-seven optional, and every request came back 400
about grammar compilation — a message no user could act on, on a feature that
could never have worked for anyone.
A shape now carries its parameters as a list of name/value pairs. Nothing in the
schema is optional, so the count is zero and stays zero however many primitives
the DSL grows, and the name enum still refuses a parameter the DSL does not have.
Types and ranges leave the grammar, which costs nothing — every value already
went through dslValidateShape's clamping. aiCoerce turns the strings back and
names the offender when it cannot ("period is not a number"), and aiToProgram
collapses the pairs into ordinary flat shapes, so what lands in the Program box
is still a program you can read and edit. The wire format never escapes it.
Behind that sat a second failure nobody could reach: "city skyline" came back as
"too many layers". The prompt states every parameter range, every primitive, the
canvas limits and the scale — and never the layer cap. dslValidate throws the
whole program away over it, so the model wrote something reasonable and the user
got an error about a limit they were never told. It is stated now, derived from
DSL_MAX_LAYERS so the two cannot drift.
Releases ship one file per platform: the Apple silicon dmg and the x64 installer.
Two dmgs, two zips and three Windows builds meant a person who downloaded twice
had PatternFront, PatternFront 2 and PatternFront 3 in Finder with nothing to say
which was which — macOS numbering duplicates, exactly as the README warns. The
release notes now say to drag to Applications before opening, which is what stops
the duplicate existing at all.
Held by two new checks that fail on the code as it stood: the schema's optional
count against the service's limit of 24, and the prompt naming whatever
DSL_MAX_LAYERS currently is.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GRMJpT8yxY2Q33td1QeP7z
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What this changes
Describe-it had never worked, for anyone.
output_config.formatcompiles the schema into a grammar, and the service caps a schema at 24 optional parameters.aiSchema()hung all 29DSL_RANGESkeys plus nine others off a singleshapeobject — 38 properties with onlytyperequired. Thirty-seven optional. Every request came back:A shape now carries its parameters as a list of name/value pairs:
{"type":"diagonal","params":[{"name":"dx","value":"1"},{"name":"period","value":"8"}]}Nothing is optional — 0 optional parameters, and it stays 0 however many primitives the DSL grows. The
nameenum still refuses a parameter the DSL doesn't have. Types and ranges leave the grammar, which costs nothing: every value already went throughdslValidateShape's clamping.aiCoerceconverts back and names the offender (period is not a number: "eight");aiToProgramcollapses pairs into flat shapes, so the Program box still shows a program you can read and edit.Then a second bug nobody could reach. With the 400 gone, "city skyline" returned
too many layers. The prompt states every parameter range, every primitive, the canvas limits and the scale — and neverDSL_MAX_LAYERS.dslValidatediscards the whole program over it. Now stated, derived from the constant so the two can't drift.One file per platform. Two DMGs, two zips and three Windows builds meant downloading twice left
PatternFront,PatternFront 2andPatternFront 3in Finder — macOS numbering duplicates, exactly asREADME.md:42already warns. Releases now ship the Apple silicon.dmgand the x64Setup.exe, and the notes say to drag to Applications before opening, which is what stops the duplicate existing.Verification
Confirmed against the real API with a live key: the request is accepted and returns a program. New checks in
tools/verify-behaviour.jsfail on the code as it stood — the schema's optional count against the limit of 24, and the prompt naming whateverDSL_MAX_LAYERScurrently is — plus coverage of the pair→flat conversion, numeric coercion and enum rejection.Full suite: 421 checks, 0 failures.
Checklist
npm run verifypasses🤖 Generated with Claude Code
https://claude.ai/code/session_01GRMJpT8yxY2Q33td1QeP7z